package de.mnit.basis.swt.dialog;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;

import de.mnit.basis.daten.FilterText;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.element.A_SWT_Dialog2;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.S_Fenster;
import de.mnit.basis.sys.Ausgabe;
import de.mnit.basis.sys.datei.DSLokal;
import de.mnit.basis.sys.datei.S_Ordner;

/**
 * @author Michael Nitsche
 */
public class SWT_Dialog_Datei extends A_SWT_Dialog2<SWT_Dialog_Datei,FileDialog> {

	private final String titel;
	private final boolean mehrere;
	private final String[] filter;
	private int typ=0; //style


	public SWT_Dialog_Datei(String titel, boolean mehrere, String... filter) {
		Fehler.objekt.wenn_Null(titel);
		this.titel=titel;
		this.mehrere=mehrere;
		this.filter=filter;
	}

	public SWT_Dialog_Datei(String titel, String... filter) {
		this(titel, false, filter);
	}


	public SWT_Dialog_Datei s1_Oeffnen() {
		this.typ=SWT.OPEN;
		return this;
	}

	public SWT_Dialog_Datei s1_Speichern() {
		this.typ=SWT.SAVE;
		return this;
	}

	public String[] gErgebnis(Object... startordner1) {
		String startordner= startordner1==null || startordner1.length!=1
			? DSLokal.home().gPfadKomplett()
			: startordner1[0] instanceof S_Ordner
				? ((S_Ordner)startordner1[0]).gPfadKomplett()
				: ""+startordner1[0];

		Display display=Display.getDefault();
		Shell shell=display.getActiveShell();
		if(shell==null) {
			Shell[] shells=Display.getDefault().getShells();
			if(shells.length>0)
				shell=shells[0];
		}
		if(shell==null) {
			Ausgabe.fehler("Keine Shell für Dialogfenster vorhanden!");
			return null;
		}

		S_Fenster<?> fenster=(S_Fenster<?>)shell.getData();
		Fehler.objekt.wenn_Null(fenster);

		if(!this.erzeugt())
			erzeugeSWT(shell);

//		String erg=swt().open();
//		return erg==null ? null : DSDatei.neu(erg);

		swt().setFilterPath(startordner);
		swt().open();
		String[] dateien=swt().getFileNames();
		for(int i=0; i<dateien.length; i++)
			dateien[i]=swt().getFilterPath()+"/"+dateien[i];
		return swt().getFileNames(); //Ergebnis ist immer ein String[], kann aber leer sein!
	}

	/**
	 * Setzt ggf. ein Standardsuffix
	 */
	public String[] gErgebnisSuffix(Object... ordner) {
		String[] erg=gErgebnis(ordner);
		String[] filter=swt().getFilterExtensions();

		if(filter==null || filter.length==0)
			return erg;

		String stdsuffix=filter[0];
		if(stdsuffix.charAt(0)=='*')
			stdsuffix=FilterText.teil(2,false,stdsuffix);
		stdsuffix=FilterText.ersetze("*","",stdsuffix);
		stdsuffix=FilterText.ersetze("?","",stdsuffix);

		String[] erg2=new String[erg.length];
		for(int i=0; i<erg.length; i++) {
			String original=erg[i];
			if(original.charAt(original.length()-1)=='.')
				stdsuffix=FilterText.teil(-2,true,stdsuffix);
			if(original.length() >= stdsuffix.length() && FilterText.teil(-stdsuffix.length(),false,original).equals(stdsuffix))
				erg[i]=original;
			else
				erg2[i]=original+stdsuffix;
		}
		return erg2;
	}


	// ERZEUGEN

	protected int style() {
		int style=this.typ;
		if(this.mehrere)
			style=style | SWT.MULTI;
		else
			style=style | SWT.SINGLE;
		return style;
	}

	// Widget?
	protected FileDialog roh(Shell basis, int style) {
		return new FileDialog((Shell)basis, style);
	}

	protected void init() {
		swt().setText(this.titel);

		if(this.filter!=null && this.filter.length>0)
			swt().setFilterExtensions(this.filter); //Darf null sein
	}

}
